class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == nullptr)
        {
            return nullptr;
        }
        //这个题目的解法就是快慢指针首先让快指针往前移动n步，然后再让慢指针和快指针一起一步一步往后走
        //当快指针移动到了nullptr的时候，慢指针所指向的位置就是要删除的点
        ListNode* fast = head;
        ListNode* slow = head;
        while(n)
        {
            if(fast)
            {
                fast = fast->next;
            }
            n--;
        }
        //如果移动完成之后fast指向了空，代表heda就是我要删除的节点
        if(fast == nullptr){
            ListNode* cur = head->next;
            delete head;
            return cur;
        }
        ListNode* pcur = head;//记录要删除节点的上一个节点
        while(fast)
        {
            fast = fast->next;
            pcur = slow;
            slow = slow->next;
        }
        //到这里说明slow指向的节点就是要删除的节点
        pcur->next  = slow->next;
        delete slow;
        return head;
    }
};